function add(a, b, c, d) {
  return a + b + c + d;
}

const multi = curry(add);
const result = multi(1,2,3)(4);
console.log("result", result);
/* 预先处理的思想，利用闭包的机制
● 柯里化的定义：接收一部分参数，返回一个函数接收剩余参数，接收足够参数后，执行原函数
● 函数柯里化的主要作用和特点就是参数复用、提前返回和延迟执行
● 柯里化把多次传入的参数合并，柯里化是一个高阶函数
● 每次都返回一个新函数
● 每次入参都是一个 */
function curry(fun,...args) {
    let allArgs = [];
    return function (...restArgs) {
        allArgs = [...args,...restArgs]
        // 如果收集到足够的参数，则调用原始的函数
        if(allArgs.length >= fun.length) {
            return fun.apply(this,allArgs)
        }else {
            // 返回可继续柯里化的函数
            return curry(fun,...allArgs)
        }
    }
}



